Shiny é um pacote do R (também disponível para o Python) que permite a criação e publicação de aplicações web sem necessidade de conhecimento prévio em HTML, CSS e JavaScript;
Ou seja, a proposta é facilitar a criação de apps web somente com conhecimento em R.
Em essência, um App Shiny é gerado a partir de dois objetos e a chamada de uma função:
UI (Interface do Usuário)
Server
Função shinyApp(ui, server)
O objeto UI é geralmente inicializado pela função fluidPage(), que gerá uma página HTML vazia (também podem ser usadas outras funções para inicializar o UI);
São definidos os tipos de inputs (valores de entrada) e outputs (valores de saída) que o App Shiny apresentará, assim como também a formatação, layout.
Há inúmeros tipos de input disponíveis no Shiny.De todo modo, para que sejam reconhecidos e processados, todos ele precisam de dois parâmetros em comum:
Parâmetro “inputId”: Trata-se de uma string simples e única que será armazenada dentro da lista “input” que é parâmetro da função server(input, output). Desse modo, deve-se utilizar id´s diferentes para referenciar diferentes inputs;
Parâmetro “label”: Trata-se do rótulo/mensagem/instrução que irá aparecer no App Shiny, orientando o usuário sobre como ele deve interagir com as opções de input dadas.
Dada uma listagem de opções fornecidas, é solicitado ao usuário selecionar uma ou algumas das opções dadas.
Semelhante à função selectInput(), mas com uma aparência levemente diferente, e permite selecionar, por padrão, múltiplas opções.
Pede ao usuário que aperte um botão interativo para que uma certa ação seja realizada no aplicativo.
A partir de uma barra de rolagem (horizontal), o usuário é informado para selecionar um número dentro de um intervalo de valores estabelecido
Trata-se de uma função para inserção de inputs em forma de texto.
Semelhante a função tenxtInput(), com a diferença que o input informado aparecerá com tarjas (“*”)
Além das funções input citadas acima, há várias outras tais como:
Os tipos de output são definidos no primeiro objeto, a UI (interface de usuário).
Assim como os inputs, no output também exigem uma identificação:
datatable(outputId = "dataframe") # Define um dataframe como output
htmlOutput(outputId = "html") # Define um documento HTML como output
imageOutput(outputId = 'image') # Define uma imagem como output
plotOutput(outputId = 'plot') # Define um gráfico como output
tableOutput(outputId = 'tabela') # Define uma tabela como output
textOutput(outputId = 'texto') # Define um texto como output
...Feito isso, para que o(s) output(s) definido(s) seja(m) devidamente executado(s) e processado(s) pelo R, faz-se necessário também o uso das render functions (funções de renderização); por exemplo, “renderText({})”;
Estas são definidas no objeto Server (falaremos sobre logo a seguir).
As render functions (funções de renderização) são os objetos que irão efetivamente explicitar os outputs previamente definidos no UI;
Alguns exemplos:
Elas possibilitam também a utilização de pacotes fora do pacote Shiny, mas que possuem suporte para renderizar seus resultados, como:
Na estrutura básica os inputs são dispostos um embaixo do outro, visando melhorar a visualização do usuário, existem funções que alteram esse padrão:
titlePanel(): que implementa um título pro app:
sidebarLayout(): essa cria o layout geral de saída e que comporta opcções de disposição de inputs e outputs.
Aqui a função tem como parametros apenas o label que está em formato de string
No layout gerado por essa função divide-se a tela de saída em duas:
sidebarPanel(): aqui estarão as entradas do usário;
mainPanel(): nesta área são as saídas geradas no server.
Neste espaço as opções de inputs vistas anteriormente são posicionadas no lado esquerdo da interface;
São possíveis envolopar mais de uma opção de input.
inputPanel(
titlePanel('BMI Calculator'),
sidebarLayout(
sidebarPanel(
textInput('name', 'Enter your name'),
numericInput('height', 'Enter height (in m)', 1.5, 1, 2, step = 0.1),
numericInput('weight', 'Enter weight (in Kg)', 60, 45, 120),
actionButton("show_bmi", "Show BMI")
),
mainPanel()
)
)Nessa função vamos incluir as saídas que foram processadas no server e adicionadas no lado direito da interface;
Aqui caso haja uma saída basta apenas utilizar:
ui <- fluidPage(
titlePanel('BMI Calculator'),
sidebarLayout(
sidebarPanel(
textInput('name', 'Enter your name'),
numericInput('height', 'Enter height (in m)', 1.5, 1, 2, step = 0.1),
numericInput('weight', 'Enter weight (in Kg)', 60, 45, 120),
actionButton("show_bmi", "Show BMI")
),
mainPanel(
textOutput("bmi")
)
)
)Caso existam mais de uma saída e deseja-se criar abas para exibir os resultados vamos usar essa função.
ui <- fluidPage(
titlePanel("UFO Sightings"),
sidebarPanel(
selectInput("state", "Choose a U.S. state:", choices = unique(usa_ufo_sightings$state)),
dateRangeInput("dates", "Choose a date range:",
start = "1920-01-01",
end = "1950-01-01"
)
),
mainPanel(
tabsetPanel(
tabPanel("Plot", plotOutput("shapes")),
tabPanel("Table", tableOutput("duration_table"))
)
)
)# Definindo a sidebar e seus parâmetros
sidebar <- dashboardSidebar(width = 300,
sidebarMenu(
id = "pages",
menuItem("Many charts", tabName = "charts",
icon = icon("chart-line")),
menuItem("Statistics", tabName = "stats",
icon = icon("file-excel"))
))
ui <- dashboardPage(header, sidebar, body)
server <- function(input, output) {
}
shinyApp(ui, server) # Adicionando subtabs na sidebar
sidebar <- dashboardSidebar(
width = 300,
sidebarMenu(
id = "pages",
menuItem("Many charts", tabName = "charts",
icon = icon("chart-line")),
menuItem("Statistics", tabName = "stats",
icon = icon("file-excel"),
menuSubItem("Team 1", tabName = "team1",
icon = icon("user")))
))
ui <- dashboardPage(header, sidebar, body)
server <- function(input, output) {
}
shinyApp(ui, server)# Adicionando inputs na sidebar
sidebar <- dashboardSidebar(width = 300,
sidebarMenu(
id = "pages",
menuItem("Many charts", tabName = "charts",
icon = icon("chart-line")),
menuItem("A couple of checkboxes",
checkboxGroupInput("checkboxes",
"Days of the week",
choices = c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")))
))
ui <- dashboardPage(header, sidebar, body)
server <- function(input, output) {
}
shinyApp(ui, server)Resumidamente, reatividade em programação é o conceito que torna possível a interação dinâmcica do usuário com o programa, no qual o que é efetivamente executado e exibido se baseia no acompanhamento das mudanças de determinados valores. Por exemplo, se um determinado input muda, um novo cálculo deve ser executado e um novo output gerado.
A reatividade se baseia em uma paradigma diferente de programção, chamado de declarativo. No Shiny, declaramos dentro da função server() quando e quais códigos devem ser executados a depender de cada nova situação. Podemos representar as relações de dependência entre input e output e os consequentes fluxos de execução nesses casos através de um diagrama de reatividade.
exemplo:
fonte: https://programando-em-shiny.curso-r.com
exemplo:
# server
server <- function(input, output, session) {
output$histograma_A <- renderPlot({
print("Gerando histograma A...")
hist(mtcars[[input$variavel_A]], main = "Histograma A")
})
output$histograma_B <- renderPlot({
print("Gerando histograma B...")
hist(mtcars[[input$variavel_B]], main = "Histograma B")
})
}
# app
shinyApp(ui, server)fonte: https://programando-em-shiny.curso-r.com
fonte: https://programando-em-shiny.curso-r.com